<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Twitter extends MY_Controller{
	private $CI;
	private $status = TRUE;
	private $http_status = '';
	private $last_api_call = '';

	private $key    = 'd9MuC6Z9AC16D0Ug5FGA'; //d9MuC6Z9AC16D0Ug5FGA   //MPqCGUskTYllpU4iOM0VQ
	private $secret = 'bnY8OTFZaxgTCXCYqXRvwKkwUnL4020arS9Xk4dgsQ'; //bnY8OTFZaxgTCXCYqXRvwKkwUnL4020arS9Xk4dgsQ  //41nH00dTH8KoynjkXbQsR2EaZDpopx4AWNySoZDWpA
	private $request_token = "https://api.twitter.com/oauth/request_token";
	private $access_token  = "https://api.twitter.com/oauth/access_token";
	private $redirect_url  = ''; // La redirect url o callback_url se asigna en la configuracion de APP en Twitter

	function Twitter(){
		parent::__construct();
		// $this->redirect_url = urlencode(base_url('twitter/signin/'));
	}

	public function _remap($method){
		$this->{$method}();
	}

	/*
	| Paso 1 Obteniendo el Request Token.
	|	Obtiene los parametros oauth_token. oauth_token_secret, oauth_callback_confirmed.
	|
	| Paso 2 Redireccionando al Usuario.
	| Redirecciona al usuario para que de permisos a la APP.
	| El usuario sera redireccionado para que de o no permisos a la APP.
	|
	| https://dev.twitter.com/docs/auth/implementing-sign-twitter
	*/
	protected function oauth()
	{
		// Parametros necesarios para la Autorizacion de la API
    $params = array(
                    'oauth_consumer_key'     => $this->key,
                    'oauth_nonce'            => time(),
                    'oauth_signature_method' => 'HMAC-SHA1',
                    'oauth_timestamp'        => time(),
                    'oauth_version'          => '1.0');

		$url = $this->buildUrl($params, TRUE);
		$result_request_token = $this->_http($url);

		parse_str($result_request_token);
		// list($oauth_token, $oauth_token_secret, $oauth_callback_confirmed) = explode('&', $result_request_token);
		header('Location:https://api.twitter.com/oauth/authenticate?oauth_token='.$oauth_token);  // Paso 2

	}

	/*
	| Paso 3 Convirtiendo el request token en acces token.
	| Si el usuario acepto o cancelo la autorizacion a la APP es redireccionado a este metodo
	| Si da permisos llegara los parametros $_GET: oauth_token y oauth_verifier
	| 	entonces se realiza otro POST enviando el oauth_verifier, una respuesta exitosa
	|  	regresara los parametros oauth_token, oauth_token_secret, user_id y screen_name
	|
	| Si no da permisos llegara el parametro $_GET: denied
	|
	| https://dev.twitter.com/docs/api/1/post/oauth/access_token
	| https://dev.twitter.com/docs/auth/implementing-sign-twitter
	*/
	private function signin()
	{
		// Si el usuario da permisos a la APP entonces se obtiene un access token legitimo
		if (isset($_GET['oauth_token']) && isset($_GET['oauth_verifier']))
		{
			$params = array('oauth_nonce'            => time(),
											'oauth_signature_method' => 'HMAC-SHA1',
											'oauth_timestamp'        => time(),
											'oauth_consumer_key'     => $this->key,
											'oauth_token' 					 => $_GET['oauth_token'],
											'oauth_version'          => '1.0');

			$url = $this->buildUrl($params, FALSE);
			$post_data = array('oauth_verifier' => $_GET['oauth_verifier']);
			$result_request_token =  $this->_http($url, $post_data);
			parse_str($result_request_token);

			$this->load->model('usuarios_model');
			if ( isset($oauth_token) && isset($user_id) ) {
				// Obtiene Informacion extra del usuario
				$extra_info = $this->_http("https://api.twitter.com/1/users/show.json?user_id=$user_id");
				$extra_info = json_decode($extra_info, TRUE);

        // Si la session existe entonces se vinculara una cuenta de twitter con el usuario logueado
        if ($this->session->userdata('id_usuario')) {
          $this->usuarios_model->vincula_tw($this->session->userdata('id_usuario'),  $user_id);
          redirect(base_url());
        }

        $info_usr = $this->usuarios_model->exec_GetWhere('usuarios', array('twitter_user_id' => $user_id), TRUE);
				if ($info_usr)
				{
          if ($info_usr[0]->status == '1')
          {
            // Si el usuario ya existe se crea la SESSION
            $mdl_res = $this->usuarios_model->setLogin(array('twitter_user_id' => $user_id));
            if ($mdl_res[0] === FALSE) {
              redirect(base_url('home/?msg=3'));
            }
          }
          else
          {
            redirect(base_url('home/?msg=2'));
          }

				}
				else
				{
					$data    = array(	'twitter_user_id' => $user_id,
														'nombre'          => isset($extra_info['name'])?$extra_info['name']:'',
														'email'           => '');

					$mdl_res = $this->usuarios_model->setRegistro(FALSE, $data);
					if ($mdl_res['error'] == FALSE)
						$mdl_res = $this->usuarios_model->setLogin(array('twitter_user_id' => $user_id));
				}
				if ($mdl_res[0] != FALSE)
					redirect(base_url());
				redirect(base_url());
			}
		}
		elseif (isset($_GET['denied'])) // Si el usuario rechazo o cancelo la autorizacion de la app
		{
			header('Location:'.base_url());
		}
	}

	private function buildUrl($params=array(), $request_token = TRUE, $return_oauth_signature = FALSE)
	{
		$keys   = $this->_urlencode_rfc3986(array_keys($params));
		$values = $this->_urlencode_rfc3986(array_values($params));
		$params = array_combine($keys, $values);
    uksort($params, 'strcmp');

    // if (isset($params['oauth_callback'])) {
    //   $oauth_callback = array_shift($params);
    //   $params['oauth_callback'] = $oauth_callback;
    // }

    $url_token = ($request_token)?$this->request_token:$this->access_token;

		foreach ($params as $k => $v) {$pairs[] = $this->_urlencode_rfc3986($k).'='.$this->_urlencode_rfc3986($v);}
    $concatenatedParams = implode('&', $pairs);

		// form base string (first key)
    $baseString= "GET&".$this->_urlencode_rfc3986($url_token)."&".$this->_urlencode_rfc3986($concatenatedParams);
    // form secret (second key)
    $secret = $this->_urlencode_rfc3986($this->secret)."&";

    // Genera el parametro oauth_signature y lo añade al array params
    $params['oauth_signature'] = $this->_urlencode_rfc3986(base64_encode(hash_hmac('sha1', $baseString, $secret, TRUE)));
    if ($return_oauth_signature)
      return $params['oauth_signature'];

    uksort($params, 'strcmp');
    // if (isset($params['oauth_callback'])) {
    //   $oauth_callback = array_shift($params);
    //   $params['oauth_callback'] = $oauth_callback;
    // }

    foreach ($params as $k => $v) {$urlPairs[] = $k."=".$v;}
    $concatenatedUrlParams = implode('&', $urlPairs);
    // form url
    return $url_token."?".$concatenatedUrlParams;
	}

	private function _http($url, $post_data = NULL)
  {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    if(isset($post_data))
    {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }

    $response = curl_exec($ch);
    $this->http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $this->last_api_call = $url;
    curl_close($ch);

    return $response;
  }

	private function _urlencode_rfc3986($input)
  {
    if (is_array($input)) {
        return array_map(array('Twitter', '_urlencode_rfc3986'), $input);
    }
    else if (is_scalar($input)) {
        return str_replace('+',' ',str_replace('%7E', '~', rawurlencode($input)));
    }
    else{
        return '';
    }
  }

}

